[Scala]03 Scala学习笔记

Scala 读取文件及网络数据、Scala读取MySQL数据、Scala操作XML文件

Posted by 李玉坤 on 2018-03-20

Scala 操作外部数据

Scala 读取文件及网络数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
import scala.io.Source

object FileApp {

def main(args: Array[String]): Unit = {

val file = Source.fromFile("/home/hadoop/hello.txt")(scala.io.Codec.ISO8859)

按照行读取文件:
def readLine(): Unit ={
for(line <- file.getLines()){
println(line)
}
}

readLine()

按照字符读取文件:
def readChar(): Unit ={
for(ele <- file) {
println(ele)
}
}

readChar()

按照url读取文件:
def readNet(): Unit ={
val file = Source.fromURL("http://www.baidu.com")
for(line <- file.getLines()){
println(line)
}
}

readNet()

}

}

Scala读取MySQL数据

1
2
3
4
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
import java.sql.{Connection, DriverManager}

object MySQLApp {

def main(args: Array[String]): Unit = {

val url = "jdbc:mysql://localhost:3306/mysql"
val username = "root"
val password = "root"

var connection:Connection = null
try{

// make the connection
classOf[com.mysql.jdbc.Driver]

connection = DriverManager.getConnection(url, username, password)

// create the statement, and run the select query
val statement = connection.createStatement()
val resultSet = statement.executeQuery("select host,user from user")
while(resultSet.next()){
val host = resultSet.getString("host")
val user = resultSet.getString("user")

println(s"$host, $user")
}
} catch {
case e:Exception => e.printStackTrace()
} finally {
// free
if(connection == null) {
connection.close()
}
}

}

}

Scala操作XML文件

xml文件

1
2
3
4
5
6
7
8
<bookshelf>
<book id="002-new">
<name>Spark Programming</name>
</book>
<book id="001-new">
<name>Scala Programming</name>
</book>
</bookshelf>

读取XML文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
import java.io.{FileInputStream, InputStreamReader}

import scala.xml.XML

object XMLApp {

def main(args: Array[String]): Unit = {

loadXML()

}

def loadXML(): Unit = {
//获取 Resource 下的xml文件
val xml = XML.load(this.getClass.getClassLoader.getResource("test.xml"))
println(xml)

//指定url路径 获取xml文件 绝对路径
val xml = XML.load(new FileInputStream(".../scala-train/src/main/resources/test.xml"))
println(xml)

//指定url路径 获取xml文件 绝对路径
val xml = XML.load(
new InputStreamReader(
new FileInputStream(".../scala-train/src/main/resources/test.xml")
)
)
println(xml)
}

}

读取XML属性内容

test.xml文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<fix major="4" minor="2">
<header>
<field name="BeginString" required="Y">FIX4.2</field>
<field name="MsgType" required="Y">Test</field>
</header>

<trailer>
<field name="Signature" required="N"/>
<field name="CheckSum" required="Y"/>
</trailer>

<messages>
<message name="Logon" msgtype="A" msgcat="admin">
<field name="ResetSeqNumFlag" required="N"/>
<field name="MaxMessageSize" required="N"/>
<group name="NoMsgTypes" required="N">
<field name="RefMsgType" required="N"/>
<field name="MsgDirection" required="N"/>
</group>
</message>
<message name="ResendRequest" msgtype="2" msgcat="admin">
<field name="BeginSeqNo" required="Y"/>
<field name="EndSeqNo" required="Y"/>
</message>
</messages>

<fields>
<field number="1" name="TradingEntityId" type="STRING"/>
<field number="4" name="AdvSide" type="STRING">
<value enum="X" description="CROSS"/>
<value enum="T" description="TRADE"/>
</field>
<field number="5" name="AdvTransType" type="STRING">
<value enum="N" description="NEW"/>
</field>
</fields>
</fix>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
  def readXMLAttr(): Unit = {
val xml = XML.load(this.getClass.getClassLoader.getResource("test.xml"))
println(xml)

// header/field
val headerField = xml \ "header" \ "field"
println(headerField)

// all field
val fields = xml \\ "field"
for (field <- fields) {
println(field)
}

// header/field/name
val fieldAttributes = (xml \ "header" \ "field").map(_ \ "@name")
val fieldAttributes = (xml \ "header" \ "field" \\ "@name")
for (fieldAttribute <- fieldAttributes) {
println(fieldAttribute)
}


//name="Logon"的message
val filters = (xml \\ "message")
.filter(_.attribute("name").exists(_.text.equals("Logon")))

val filters = (xml \\ "message")
.filter(x => ((x \ "@name").text).equals("Logon"))


for (filter <- filters) {
println(filter)
}

// header/field 内容
(xml \ "header" \ "field")
.map(x => (x \ "@name", x.text, x \ "@required"))
.foreach(println)
}

修改XML属性内容

books.xml文件

1
2
3
4
5
6
7
8
9
10
11
<bookshelf>
<book id="001">
<name>Scala</name>
<author>PK</author>
</book>

<book id="002">
<name>Spark</name>
<author>pk</author>
</book>
</bookshelf>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
def updateXML(): Unit ={
val xml = XML.load(this.getClass.getClassLoader.getResource("books.xml"))
println(xml)

val bookMap = scala.collection.mutable.HashMap[String,String]()

//将xml赋值给bookMap
(xml \ "book").map(x => {
val id = (x \ "@id").toString()
val name = (x \ "name").text.toString
bookMap(id) = name
})

//遍历出bookMap
for((key,value) <- bookMap) {
println(s"$key : $value")
}

val newXml = <bookshelf>{bookMap.map(updateXmlFile)}</bookshelf>

// println(newXml)
XML.save("newBooks.xml", newXml)
}

//修改方法
def updateXmlFile(ele:(String,String)) = {
val (id, oldName) = ele

<book id={id + "-new"}>
<name>{oldName + " Programming"}</name>
</book>
}